home *** CD-ROM | disk | FTP | other *** search
/ Aminet 3 / Aminet 3 - July 1994.iso / Aminet / dev / lang / SML.lha / sml / Programs / diff next >
Encoding:
Text File  |  1991-12-12  |  1.2 KB  |  30 lines

  1. (* Differentiating a symbolic expression -- classical LISP introduction *)
  2.  
  3.  
  4. datatype expr = ConEx of real
  5.               | VarEx of string
  6.               | MonEx of string * expr
  7.               | BinEx of expr * string * expr;
  8.  
  9. fun ds ("exp",e)    = MonEx("exp",e)
  10.   | ds ("sin",e)    = MonEx("cos",e)
  11.   | ds ("cos",e)    = MonEx("~",MonEx("sin",e))
  12.   | ds ("ln", e)    = BinEx(ConEx 1.0,"/",e)
  13.   | ds ("arctan",e) = BinEx(ConEx 1.0,"/",BinEx(e,"*",e));
  14.  
  15. fun diff (VarEx v) va          = if v=va then ConEx 1.0 else ConEx 0.0
  16.   | diff (ConEx _) _           = ConEx 0.0
  17.   | diff (MonEx (s,e)) v       = BinEx (ds (s,e),"*",diff e v)
  18.   | diff (BinEx (e1,"+",e2)) v = BinEx (diff e1 v,"+",diff e2 v)
  19.   | diff (BinEx (e1,"-",e2)) v = BinEx (diff e1 v,"-",diff e2 v)
  20.   | diff (BinEx (e1,"*",e2)) v = BinEx (BinEx(diff e1 v,"*",e2),
  21.                                        "+",
  22.                                        (BinEx(e1,"*",diff e2 v)))
  23.   | diff (BinEx (e1,"/",e2)) v = BinEx (BinEx (BinEx (e2,"*",diff e1 v),
  24.                                                "-",
  25.                                               (BinEx (e1,"*",diff e2 v))),
  26.                                         "/",
  27.                                        (BinEx (e2,"*",e2)));
  28.  
  29.  
  30.